#include <iostream>

#include "iostream"
#include "vector"
#include "unordered_map"
#include "unordered_set"
#include "algorithm"
#include "string"
#include "list"
#include "string.h"


class OneLoop {
public:
    std::vector<std::vector<int>> vec2;
    std::vector<char> tag_vec;
    int all_sum=0;
    int w,h;
    int res=-1;
    bool end=false;
    void tag(int x,int y){
        tag_vec[x*w+y]=1;
    }
    void untag(int x,int y){
        tag_vec[x*w+y]=0;
    }
    char gettag(int x,int y){
        return tag_vec[x*w+y];
    }
    void dfs(int x,int y,int sum,int depth){
        if(x<0||y<0||x>=w||y>=h){
            return;
        }
        if(end){
            return;
        }
        if(gettag(x,y)){
            return;
        }
        tag(x,y);
        sum+=vec2[x][y];
        if(all_sum-sum==sum){
            res=depth;
            end= true;
            return;
        }
        dfs(x+1,y,sum,depth+1);
        dfs(x-1,y,sum,depth+1);
        dfs(x,y+1,sum,depth+1);
        dfs(x,y-1,sum,depth+1);

        untag(x,y);
    }
    bool run(
            int a, int b
    ) {
        w=a;h=b;
        tag_vec.resize(a*b);
        for(int i=0;i<a;i++){
            std::vector<int> line(b);
            for(int j=0;j<b;j++){
                std::cin>>line[j];
                all_sum+=line[j];
            }
            vec2.push_back(line);
        }
        dfs(0,0,0,0);
        printf("%d\n",res);
        return true;
    }
};

class Solution {
public:
    void run() {

        bool first = true;
        int a, b, c, d, e;
        //        std::cin >> a;
//        std::string s1,s2;
//        while (1){
        while (std::cin >> a >> b) {
//            std::getline(std::cin,s2);
            OneLoop l;
            if (!l.run(a, b)) {
//                                return;
            }
        }


    }
};

int main() {

    //    bool cur_num= true;
    Solution().run();
    return 0;
}

